<script>
	/*
	   作用域与函数声明位置有关
	   this指向与函数声明位置???没有任何关系(除了箭头函数)
	   this指向与函数调用方式有关
	   常见this指向:
	       一共是4种
	       1.普通调用  ->  a();
	           此类方法,this指向为window
	       2.构造调用  ->  new a();
	           此类方法,this指向为实例对象
	       3.隐式调用  ->  obj.fn();
	           此类方法,this指向为该方法所属的对象(obj)
	       4.显式调用  ->  a.call(参数)    call/apply/bind
	           此类方法可以强制指定函数的this指向,this指向为call函数的第一个实参

	   特殊的this指向:
	       1.事件回调函数  ->  box.onclick=function(){}
	           此类方法,this指向为绑定事件监听的事件源对象(box)
	       2.定时器    ->  setTimeout(回调函数)
	           此类方法->this指向为window
	       3.Vue组件
	           此类方法中,methods,computed,watch,生命周期钩子函数,this指向都是当前组件实例对象
	       4.React组件
	           如果是以a(){}写法声明回调函数,那么this指向是undefined
	           如果是以a=()=>{}写法声明回调函数,那么this指向是组件实例对象
	       5.箭头函数
	           箭头函数没有自己的this,他内部如果使用this,就会顺着作用域链向上查找(使用父级作用域的this)

	   面试题:请问call/apply/bind能否改变箭头函数的this指向?
	           不能

	   面试题:请问箭头函数能否构造调用?
	           不能

	   面试题:请问箭头函数是否具有原型对象?
	           没有(他不可能具有实例对象,所以不需要原型对象)
	       */

	// 练习一：
	function a() {
		console.log(this);
	}
	a(); //window

	new a(); //a{}

	var obj = {
		fn: a,
	};
	obj.fn(); //obj{}

	var obj2 = {
		name: "obj2",
	};
	a.call(obj2); //{"name": "obj2"}
	new a(); //a{}

	// 练习二：
	var b = () => {
		console.log(this);
	};
	b.call(obj2); //window
	// new b(); //b is not a constructor
	console.log(obj2); //{"name": "obj2"}
</script>
